/*
 * Copyright 2019 Flipkart Internet Pvt. Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.flipkart.ohos.proteus.parser.custom;

import ohos.agp.components.ComponentContainer;
import ohos.agp.components.Image;
import ohos.app.AbilityContext;
import ohos.global.resource.Resource;
import ohos.global.resource.ResourceManager;
import ohos.media.image.ImageSource;
import ohos.media.image.PixelMap;
import ohos.media.image.common.PixelFormat;

import com.flipkart.ohos.proteus.HiExecutor;
import com.flipkart.ohos.proteus.ProteusContext;
import com.flipkart.ohos.proteus.ProteusView;
import com.flipkart.ohos.proteus.ViewTypeParser;
import com.flipkart.ohos.proteus.parser.ParseHelper;
import com.flipkart.ohos.proteus.processor.StringAttributeProcessor;
import com.flipkart.ohos.proteus.toolbox.Attributes;
import com.flipkart.ohos.proteus.value.Layout;
import com.flipkart.ohos.proteus.value.ObjectValue;
import com.flipkart.ohos.proteus.view.ProteusImage;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by kiran.kumar on 12/05/14.
 */
public class ImageParser<T extends Image> extends ViewTypeParser<T> {
    private AbilityContext context;

    @Override
    public String getType() {
        return "Image";
    }

    @Override
    public String getParentType() {
        return "Component";
    }

    @Override
    public ProteusView createView(ProteusContext proteusContext, Layout layout, ObjectValue data,
                                  ComponentContainer parent, int dataIndex) {
        this.context = proteusContext.context;
        return new ProteusImage(proteusContext);
    }

    @Override
    protected void addAttributeProcessors() {
        addAttributeProcessor(Attributes.Image.Url, new StringAttributeProcessor<T>() {
            @Override
            public void setString(T view, String value) {
                HiExecutor.runBg(() -> {
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL(value);
                        URLConnection urlConnection = url.openConnection();
                        if (urlConnection instanceof HttpURLConnection) {
                            connection = (HttpURLConnection) urlConnection;
                        }
                        if (connection != null) {
                            connection.connect();
                            InputStream inputStream = urlConnection.getInputStream();
                            ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
                            decodingOptions.desiredPixelFormat = PixelFormat.ARGB_8888;
                            ImageSource imageSource = ImageSource.create(inputStream, new ImageSource.SourceOptions());
                            PixelMap pixelMap = imageSource.createPixelmap(decodingOptions);
                            HiExecutor.runUi(() -> {
                                view.setPixelMap(pixelMap);
                                pixelMap.release();
                            });
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            }
        });

        addAttributeProcessor(Attributes.Image.Src, new StringAttributeProcessor<T>() {
            @Override
            public void setString(T view, String value) {
                ResourceManager resourceManager = context.getResourceManager();
                Resource resource;
                try {
                    if (resourceManager != null) {
                        resource = resourceManager.getRawFileEntry(value).openRawFile();
                        ImageSource.DecodingOptions decodingOptions = new ImageSource.DecodingOptions();
                        decodingOptions.desiredPixelFormat = PixelFormat.ARGB_8888;
                        ImageSource imageSource = ImageSource.create(resource, new ImageSource.SourceOptions());
                        PixelMap pixelMap = imageSource.createPixelmap(decodingOptions);
                        view.setPixelMap(pixelMap);
                        pixelMap.release();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        addAttributeProcessor(Attributes.Image.ScaleMode, new StringAttributeProcessor<T>() {
            @Override
            public void setString(T view, String value) {
                ProteusImage.ScaleMode scaleMode;
                scaleMode = ParseHelper.parsescaleMode(value);
                if (scaleMode != null) {
                    view.setScaleMode(scaleMode);
                }
            }
        });
    }
}
